import axios from 'axios'
import { ElMessage } from 'element-plus'
import userStoreCreater from '@/store/userStore.js'
import { useRequest } from './useRequest'
const { ifCancelCurrentReq, removeRequestMap, addRequestMap, clearRequestMap } = useRequest()

const API_PREFIX = import.meta.env.VITE_API_PREFIX

const service = axios.create({
  baseURL: API_PREFIX,
  timeout: 10000,
})

// 请求前的统一处理
service.interceptors.request.use(
  (config) => {
    // 检测是否存在重复请求，若存在，则取消重复的请求
    if (!ifCancelCurrentReq(config)) {
      // 不重复，把当前请求信息添加到requestMap对象中
      addRequestMap(config)
      // JWT鉴权处理
      const userStore = userStoreCreater()
      if (userStore.getToken) {
        config.headers.token = userStore.getToken
      }
    }
    return config
  },
  (error) => {
    // 这里的错误一般是网络波动造成的， 清空requestMap
    clearRequestMap()
    return Promise.reject(error)
  }
)
// 请求后的统一处理
service.interceptors.response.use(
  (response) => {
    // 状态200
    removeRequestMap(response.config || {}) // 从requestMap对象中移除请求

    const res = response.data

    // 如果是请求的js文件，直接返回res
    if (response.config.url.endsWith('config.js') || response.config.url.endsWith('.json')) {
      return res
    }
    // 返回成功
    if (res.errcode === 0) {
      return res
    }
    // 登录超时
    if (res.errcode === 401) {
      showError(res)
      const userStore = userStoreCreater()
      userStore.logOut() //退出
      return Promise.reject({ errcode: -1, errmsg: '登录超时' })
    }
    // 返回错误信息
    showError(res)
    return Promise.reject(res)
  },
  (error) => {
    // 状态非200
    removeRequestMap(error.config || {}) // 从requestMap对象中移除请求

    // 如果是主动取消请求的
    if (axios.isCancel(error)) {
      return Promise.reject({
        errcode: -1,
        errmsg: '取消请求',
      })
    }

    const badMessage = error.message || error
    const code = parseInt(badMessage.toString().replace('Request failed with status code ', ''))
    showError({ code })
    return Promise.reject(error)
  }
)

// 判断错误码errcode
function showError(res) {
  // 统一为标准格式, 非0的errcode, errmsg，
  if (res.errcode) {
    ElMessage({
      message: res?.msg || res?.message || res?.errmsg || '服务异常',
      type: 'error',
      duration: 3 * 1000,
    })
  }
}

export default service
